package pers.chy.chyappointmentplatform.WS;

//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
import com.google.gson.Gson;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import pers.chy.chyappointmentplatform.Model.NoMapping.ReplyMsgDTO;
import pers.chy.chyappointmentplatform.Service.CallNumberService;
import pers.chy.chyappointmentplatform.Service.InteractiveService;
import pers.chy.chyappointmentplatform.Socket.Server_PICC;
import pers.chy.chyappointmentplatform.Utils.ChyException;

import javax.jws.WebService;
import java.util.Map;


/**
 * WebService涉及到的有这些 "四解三类 ", 即四个注解，三个类
 *
 * @WebMethod
 * @WebService
 * @WebResult
 * @WebParam SpringBus
 * Endpoint
 * EndpointImpl
 * <p>
 * 一般我们都会写一个接口，然后再写一个实现接口的实现类，但是这不是强制性的
 * @WebService 注解表明是一个webservice服务。
 * name：对外发布的服务名, 对应于<wsdl:portType name="ServerServiceDemo"></wsdl:portType>
 * targetNamespace：命名空间,一般是接口的包名倒序, 实现类与接口类的这个配置一定要一致这种错误
 * Exception in thread "main" org.apache.cxf.common.i18n.UncheckedException: No operation was found with the name xxxx
 * 对应于targetNamespace="http://server.webservice.example.com"
 * endpointInterface：服务接口全路径（如果是没有接口，直接写实现类的，该属性不用配置）, 指定做SEI（Service EndPoint Interface）服务端点接口
 * serviceName：对应于<wsdl:service name="ServerServiceDemoImplService"></wsdl:service>
 * portName：对应于<wsdl:port binding="tns:ServerServiceDemoImplServiceSoapBinding" name="ServerServiceDemoPort"></wsdl:port>
 * @WebMethod 表示暴露的服务方法, 这里有接口ServerServiceDemo存在，在接口方法已加上@WebMethod, 所以在实现类中不用再加上，否则就要加上
 * operationName: 接口的方法名
 * action: 没发现又什么用处
 * exclude: 默认是false, 用于阻止将某一继承方法公开为web服务
 * @WebResult 表示方法的返回值
 * name：返回值的名称
 * partName：
 * targetNamespace:
 * header: 默认是false, 是否将参数放到头信息中，用于保护参数，默认在body中
 * @WebParam name：接口的参数
 * partName：
 * targetNamespace:
 * header: 默认是false, 是否将参数放到头信息中，用于保护参数，默认在body中
 * model：WebParam.Mode.IN/OUT/INOUT
 */
@Component
@WebService(
        name = "ServiceName",                                                   // 此处应与接口中的注解一致
        targetNamespace = "http://pers.chy.appointermentplatform.WS",           // 此处应与接口中的注解一致
        endpointInterface = "pers.chy.chyappointmentplatform.WS.MyWebService")       // 此处必须是接口类的全路径 ！！！
public class MyWebServiceImpl implements MyWebService {

    @Autowired
    InteractiveService interactiveService;

    @Autowired
    private CallNumberService callNumberService;

    @Override
    public String helloWebService(String msg) {
        if (null == msg || "".equals(msg.trim())) {
            return "传入的参数为空";
        }
        return "HelloWebService 调用成功";
    }

    /**
     * 排队取号
     * @param msg
     * @return
     */
    @Override
    public String takeQueueNumber(String msg) {

        String reply = "<CHYXml><MsgHeader><Sender>AppointmentPlatform</Sender><Status>%状态码%</Status><Detail>%错误信息%</Detail></MsgHeader>%消息体%</CHYXml>";

        // 日志
        Logger log = LoggerFactory.getLogger(MyWebServiceImpl.class); // 使用指定的类XXX初始化日志对象，方便在日志输出的时候，可以打印出日志信息所属的类。
        log.info("[WS入参]："+msg);

        /* 进入Service层处理业务，根据是否发生异常判断业务是否成功 */
        boolean isServiceSuccess;
        try {
            String bodyXML = interactiveService.doTakeQueueNumber(msg);
            // 业务成功
            isServiceSuccess=true;
            reply = reply.replaceAll("%状态码%", "true").replaceAll("%错误信息%", "").replaceAll("%消息体%", bodyXML);
        } catch (Exception ex) {
            // 业务失败
            isServiceSuccess=false;
            reply = reply.replaceAll("%状态码%", "false").replaceAll("%错误信息%", ex.getMessage()).replaceAll("%消息体%", "");
            // 异常日志
            if(ex instanceof ChyException) log.error("[错误]"+ ex.getMessage());
            else log.error("[不期望的异常]",ex);
        }

        if(isServiceSuccess==true){
            /*
             *  向Socket客户端群发叫号数据
             *  Socket失败时不影响Controller的逻辑，仅记录日志
             * */
            try{
                ReplyMsgDTO socketMsgDTO=new ReplyMsgDTO();
                // 获取此队列的最新叫号数据（未叫号、已叫号）
                Map dataMap = callNumberService.getLatestData(1);   //写死 PICC
                socketMsgDTO.setStatus(true);
                socketMsgDTO.setDetail(String.format("%s&%s",
                        new Gson().toJson(dataMap.get("wjh")),
                        new Gson().toJson(dataMap.get("yjh"))));
                String socketMsgDTOStr = new Gson().toJson(socketMsgDTO);
                // 群发
                Server_PICC.BroadCastInfo(socketMsgDTOStr);

            }catch (Exception ex){
                // 异常日志
                if(ex instanceof ChyException ) log.error("[错误]"+ ex.getMessage());
                else log.error("[不期望的异常]",ex);
            }
        }





        log.info("[WS出参]："+reply);
        return reply;
    }
}
